package models;
import java.util.concurrent.ArrayBlockingQueue;
public class Server implements Runnable {
private ArrayBlockingQueue<Task> tasks;
private volatile int totalEmptyTime = 0;
private TaskScheduler scheduler;
private volatile Boolean runFlag = true;
private int ID;
public Server(int id, TaskScheduler scheduler, int size) {
this.ID = id;
this.scheduler = scheduler;
this.tasks = new ArrayBlockingQueue<>(size);
}
@Override
public void run() {
while (runFlag) {
if (!tasks.isEmpty()) {
try {
Thread.sleep(tasks.peek().getServingTime() * 1000);
if (tasks.peek() != null) {
Utilities.appendToLog(scheduler,
"<-- Task " + tasks.peek() + " left at:" + (scheduler.getCurrentCycle() - 1) + "\n");
TaskScheduler.addWaitingTime(scheduler.getCurrentCycle() - tasks.peek().getArrivalTime()
+ tasks.peek().getServingTime());
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
tasks.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} else {
totalEmptyTime++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public Boolean getRunFlag() {
return runFlag;
}
public void stopExecution() {
synchronized (runFlag) {
runFlag = false;
}
}
public int queueSize() {
synchronized (tasks) {
return tasks.size();
}
}
public boolean isEmpty() {
return tasks.isEmpty();
}
public synchronized int getTotalWaitingTime() {
return totalEmptyTime;
}
public Task[] getTasks() {
Task[] t = new Task[tasks.size()];
return tasks.toArray(t);
}
public void addTasks(Task t) {
try {
tasks.put(t);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void deleteTasks() {
try {
tasks.take();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean isAlive() {
return runFlag;
}
public int getID() {
return ID;
}
}